﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
using Ortodoctor.Componentes;

namespace Ortodoctor.modelo
{
    class modeloAgenda
    {
        //string connectionstring = ("Server=186.202.152.24;Port=5432;User Id=ortodoctor1;Password=DycbqDfHLI;Database=ortodoctor1;MinPoolSize=5;CommandTimeout=60;");
        string connectionstring = ("Server=localhost;Port=5432;User Id=postgres;Password=postgres;Database=ortodoctor;MinPoolSize=5;CommandTimeout=60;"); NpgsqlCommand com;
        NpgsqlConnection conn;
        NpgsqlDataAdapter da;
        public modeloAgenda()
        {
            conn = new NpgsqlConnection(connectionstring);
            conn.Open();
        }

        public void marcarCancelamento(int idAgenda)
        {
            try
            {
                //con.open();
                String sql = "UPDATE agenda SET opcao_cancelado = TRUE WHERE id_agenda = :idAgenda";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("idAgenda", idAgenda);
                com.ExecuteNonQuery();
            }
            finally
            {
                conn.Close();
            }
        }

        public void marcarComparecimento(int idAgenda)
        {
            try
            {
                //con.open();
                String sql = "UPDATE agenda SET opcao_compareceu = TRUE WHERE id_agenda = :idAgenda";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("idAgenda", idAgenda);
                com.ExecuteNonQuery();
            }
            finally
            {
                conn.Close();
            }
        }

        public int insert(Componentes.Agenda a)
        {
            try
            {
                //con.open();
                String sql = "INSERT INTO agenda (id_dentista, id_procedimento_cliente, data_inicial, data_final, id_filial, observacoes) " +
                             "VALUES (:p1, :p2, :p3, :p4, :p5, :p6) RETURNING id_agenda";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("p1", a.Dentista.IdDentista);
                com.Parameters.AddWithValue("p2", a.ProcedimentoCliente.IdProcedimentoCliente);
                com.Parameters.AddWithValue("p3", a.DataInicial);
                com.Parameters.AddWithValue("p4", a.DataFinal);
                com.Parameters.AddWithValue("p5", a.Clinica.IdClinica);
                com.Parameters.AddWithValue("p6", a.Observacoes);

                NpgsqlDataAdapter da = new NpgsqlDataAdapter(com);
                DataTable dt = new DataTable();
                da.Fill(dt);

                return Convert.ToInt32(dt.Rows[0][0]);
            }
            catch
            {
                return -1;
            }
            finally
            {
                conn.Close();
            }
        }

        public DataTable getAll()
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = "SELECT * FROM agenda INNER JOIN dentista using(id_dentista) INNER JOIN " +
                             "procedimento_cliente using (id_procedimento_cliente) JOIN clinica ON " +
                             "agenda.id_filial = clinica.id_clinica";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt;
        }

        public DataTable getAgenda(int id)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = "SELECT * FROM agenda INNER JOIN dentista using(id_dentista) INNER JOIN " +
                             "procedimento_cliente using (id_procedimento_cliente) JOIN clinica ON " +
                             "agenda.id_filial = clinica.id_clinica WHERE id_agenda=:id";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("id", id);
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(com);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt;
        }

        public DataTable getAgendasDia(int idDentista, DateTime dtInicial, DateTime dtFinal)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = "SELECT agenda.id_agenda, " +
                                    "agenda.data_inicial, " +
                                    "agenda.data_final, " +
                                    "agenda.observacoes, " +
                                    "agenda.id_dentista, " +
                                    "agenda.id_procedimento_cliente, " +
                                    "agenda.id_filial, " +
                                    "agenda.opcao_compareceu, " +
                                    "agenda.opcao_cancelado, " +
                                    "cliente.nome as nome_cliente, " +
                                    "cliente.id_cliente " +
                               "FROM agenda " +
                              "INNER JOIN dentista USING(id_dentista) " +
                              "INNER JOIN procedimento_cliente USING (id_procedimento_cliente) " +
                              "INNER JOIN clinica ON agenda.id_filial = clinica.id_clinica " +
                              "INNER JOIN cliente USING(id_cliente) " +
                              "INNER JOIN procedimento USING(id_procedimento) " +
                              "WHERE dentista.id_dentista = :idDentista " +
                                "AND CAST(agenda.data_inicial AS DATE) >= CAST(:dtInicial AS DATE) " +
                                "AND CAST(agenda.data_inicial AS DATE) <= CAST(:dtFinal AS DATE) " +
                                "AND agenda.opcao_cancelado = FALSE " + 
                              "ORDER BY data_inicial";

                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("idDentista", idDentista);
                com.Parameters.AddWithValue("dtInicial", dtInicial);
                com.Parameters.AddWithValue("dtFinal", dtFinal);
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(com);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }

            return dt;
        }

        public DataTable getAgendasDia(String dia, String dentista)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = "SELECT * FROM agenda INNER JOIN dentista using(id_dentista) INNER JOIN " +
                         "procedimento_cliente using (id_procedimento_cliente) JOIN clinica ON " +
                         "agenda.id_filial = clinica.id_clinica INNER JOIN " +
                         "cliente using(id_cliente) INNER JOIN procedimento " +
                         "using(id_procedimento) WHERE data_agenda=:id and dentista.id_dentista=:dentista order by hora";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("id", dia);
                com.Parameters.AddWithValue("dentista", dentista);
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(com);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt;
        }

        //public void update(Componentes.Agenda a)
        //{
        //    /*try
        //    {
        //        //con.open();
        //        String sql = "UPDATE agenda SET id_dentista=:p1, id_procedimento_cliente=:p2, data_agenda=:p3, " +
        //                     "hora=:p4, id_filial=:p5 WHERE id_agenda=:id";
        //        NpgsqlCommand com = new NpgsqlCommand(sql, conn);
        //        com.Parameters.AddWithValue("p1", a.Dentista.IdDentista);
        //        com.Parameters.AddWithValue("p2", a.ProcedimentoCliente.IdProcedimentoCliente);
        //        com.Parameters.AddWithValue("p3", a.DataAgenda);
        //        com.Parameters.AddWithValue("p4", a.Hora);
        //        com.Parameters.AddWithValue("p5", a.Clinica.IdClinica);
        //        com.Parameters.AddWithValue("id", a.IdAgenda);
        //        com.ExecuteNonQuery();
        //    }
        //    finally
        //    {
        //        conn.Close();
        //    }*/
        //}

        //public void delete(int id)
        //{
        //    try
        //    {
        //        //con.open();
        //        String sql = "DELETE FROM agenda WHERE id_agenda=:id";
        //        NpgsqlCommand com = new NpgsqlCommand(sql, conn);
        //        com.Parameters.AddWithValue("id", id);
        //        com.ExecuteNonQuery();
        //    }
        //    finally
        //    {
        //        conn.Close();
        //    }
        //}
    }
}
